import pyautogui  # 导入pyautogui库，用于控制鼠标和屏幕操作
import time  # 导入time库，用于处理时间相关的功能
class PID:  # 定义PID控制类
    def __init__(self):  # 初始化PID控制器的参数
        self.P = 0  # 比例项初始化为0
        self.I = 0  # 积分项初始化为0
        self.D = 0  # 微分项初始化为0
        self.target_amount = 0  # 目标值初始化为0
        self.deviation = 0  # 当前偏差初始化为0
        self.last_deviation = 0  # 上一次偏差初始化为0
    def PidControl(self, input, kp: float, ki: float, kd: float):  # PID控制方法,定义数据的类型

        self.deviation = input - self.target_amount  # 计算当前偏差
        self.P = self.deviation * kp  # 计算比例项
        self.I = (self.I + self.deviation) * ki  # 计算积分项
        self.D = (self.deviation - self.last_deviation) * kd  # 计算微分项
        self.last_deviation = self.deviation  # 更新上一次偏差
        return self.P + self.I + self.D  # 返回PID控制器的输出
def move_mouse_to(x, y):  # 定义移动鼠标到指定位置的函数
    pyautogui.moveTo(x, y, duration=0.5)  # 使用pyautogui移动鼠标，持续时间为0.5秒

def get_mouse_position():  # 定义获取当前鼠标位置的函数
    return pyautogui.position()  # 返回当前鼠标的位置

def main():  # 主函数
    kp = 0.1  # 设置比例系数
    ki = 0.01  # 设置积分系数
    kd = 0.05  # 设置微分系数

    pid_x = PID()  # 创建PID控制器对象，用于控制x轴
    pid_y = PID()  # 创建PID控制器对象，用于控制y轴

    target_x = 300  # 设置目标x坐标
    target_y = 300  # 设置目标y坐标【通过yolo识别算法得到人物的位置坐标也就有了标准位置对人像进行识别】

    while True:  # 开始无限循环，持续调整鼠标位置
        current_position = get_mouse_position()  # 获取当前鼠标位置
        x_error = target_x - current_position.x  # 计算x轴偏差
        y_error = target_y - current_position.y  # 计算y轴偏差

        new_x = pid_x.PidControl(x_error, kp, ki, kd)  # 计算x轴调整值
        new_y = pid_y.PidControl(y_error, kp, ki, kd)  # 计算y轴调整值

        pid_x.target_amount = x_error  # 设置x轴目标偏差
        pid_y.target_amount = y_error  # 设置y轴目标偏差

        move_mouse_to(target_x + new_x, target_y + new_y)  # 移动鼠标到调整后的位置
        time.sleep(0.01)  # 控制循环速度，暂停0.01秒
        if  new_x< 1:
            break

if __name__ == '__main__':  # 如果这个脚本是作为主程序运行的
    main()  # 调用主函数